package xu.jiang.report.util;

import net.sf.json.JSONArray;
import org.apache.commons.lang3.StringUtils;
import xu.jiang.report.MyConstant;

import java.io.*;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Properties;

/*
 * 这个帮助类专门处理 数据格式上的转换问题--多以json和其他格式互转
 * 
 * @author yhr
 * 
 */
/**
 * @author 姜旭
 * @date 2015-08-25
 */
public final class DataHelper {

	/**
	 * 语言配置文件
	 */
	private static Properties currentlanguageValues;
	
//	private static Map<String,String> languagePath;
//	static {
//		languagePath = new HashMap<String,String>();
//		languagePath.put("zh_CN", "config/zh_CN.properties");
//		languagePath.put("en_US", "config/en_US.properties");
//
//	}
	/**
	 * 系统配置文件
	 */
	private static Properties reportProperty;
//	/**
//	 * 认证文件
//	 */
//	private static Properties licenseProperty;
	
	/**
	 * 将key=value的形式转成{"key":value}的json格式
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public static <T> String getJsonObject(String key, T value) {
		if (value instanceof Integer) {
			return "{\"" + key + "\":" + value + "}";
		} else if (value instanceof Boolean) {
			return "{\"" + key + "\":" + value + "}";
		} else {
			return "{\"" + key + "\":\"" + value + "\"}";
		}

	}

	/**
	 * 将key=value的形式转成"key":value的json格式片段,不包含逗号
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public static <T> String getJsonString(String key, T value) {
		if (value instanceof Integer) {
			return " \"" + key + "\":" + value + " ";
		} else if (value instanceof Boolean) {
			return " \"" + key + "\":" + value + " ";
		} else {
			return " \"" + key + "\":\"" + value + "\" ";
		}

	}

//	/**
//	 * 将bean、map转换成对象json串
//	 *
//	 * @param t
//	 * 			@return{"key":false,"key2":"ddd","key3":99
//	 */
//	public static <T> String getJsonObject(T t) {
//		/*
//		 * StringBuffer jsonObject = new StringBuffer("{"); for(String key:
//		 * map.keySet()){ String value = map.get(key); String
//		 * json_o="\""+key+"\":\""+value+"\","; jsonObject.append(json_o); } int
//		 * index = jsonObject.toString().lastIndexOf(","); String newS
//		 * =jsonObject.toString().substring(0, index)+"}";
//		 */
//		return JSONObject.fromObject(t).toString();
//	}

	/**
	 * 将list<bean>转换成数组对象的json串
	 * 
	 * @param t
	 * @return [{},{},{}]
	 */
	public static <T> String getJsonArray(T t) {
		return JSONArray.fromObject(t).toString();
	}

	/**
	 * 经过测试 在新增和编辑无需转换，而datagrid 显示需要转换
	 * 
	 * 专门针对datagrid的展现，如果json数据中不能包含html代码 将json串中的不合法字符转义：即双引号 ":\"
	 * 
	 * @param jsonStr
	 * @return
	 */
	public static String filterJsonHtmlStr4Datagrid(String jsonStr) {
		// &apos;----单引号
		// &quot;-----双引号

		// 万全之策：全部转换
		if (jsonStr == null) {
			return "";
		}
		// 最大集合
		// return
		// jsonStr.replaceAll("\n","<br />").replaceAll("\t\r","<br
		// />").replaceAll("\r\t","<br
		// />").replaceAll("\r","&nbsp;").replaceAll("\r","&nbsp;").replaceAll("\"",
		// "&quot;").replaceAll("'", "&apos;").replaceAll("<",
		// "&lt;").replaceAll(">",
		// "&gt;").replaceAll("\t\r","&nbsp;").replaceAll("\r\t","&nbsp;").replaceAll("
		// ",
		// "&nbsp;");
		// 最小集合
		// \s 匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
		return jsonStr.replace("\\", "\\\\").replace("\"", "&quot;").replace("<", "&lt;").replace(">", "&gt;")
				.replace("\n", "<br />").replaceAll("[\\s]", "&nbsp;&nbsp;");

	}

	



	
	/**
	 * 获取指定格式的整数
	 * @param number 整数>=0
	 * @param level 总位数；
	 * 		如果number总位数小于level,自动前缀补齐0，使总位数到达level；
	 * 		如果number超出位数，则直接返回number
	 * 	
	 * 
	 * @return 
	 * 异常情况：
	 * if number<0 then return ""
	 * if level<=0 then return number
	 * 
	 */
	public static String getFormatInteger(int number,int level) {
		if(number<0) {
			return "";
		}
		if(level<=0) {
			return String.valueOf(number);
		}
		
		String str = String.valueOf(number);
		int len = str.length();
		if(len>=level) {
			return String.valueOf(number);
		}
		
		int cha = level-len;//差值
		char[] chars = new char[cha];
		for(int i=0;i<cha;i++){
			chars[i] = '0';
		}
		
		return String.valueOf(chars)+str;
	}
	
	
//	/**
//	 * 获取安装目录
//	 * @return
//	 */
//	@Deprecated
//	public static Path getInstallHome(String... dir ){
//		Path home = PathUtil.getRootPath().getParent().getParent().getParent();
//		//String home = getRootPath().toString().replace("construction", "").replace("webapps", "").replace("tomcat", "");
//		return Paths.get(home.toString(),dir);
//
//	}

	
	

	/**
	 * 保留三位小数
	 * 
	 * @param n
	 * @return
	 */
	public static double formatDouble(Double n) {
		if (n == null) {
			return 0.000;
		}
		return new BigDecimal(n).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 获取项目根目录
	 * @return
	 */
	public static Path getDirOfRoot(){
		return Paths.get(System.getProperty("user.dir"));
	}

	/**
	 * 配置文件目录
	 * @return
	 */
	public static Path getDirOfConfig(){
		return getDirOfRoot().resolve(MyConstant.CONFIG_DIR);
	}
	public static Path getLanguageConfig(){
		return getDirOfConfig().resolve(MyConstant.CONFIGFILE_LANGUAGE);
	}

	public static Path getReportConfig(){
		return getDirOfConfig().resolve(MyConstant.CONFIGFILE_REPORT);
	}

	/**
	 * 获取语言配置文件
	 * @return
	 */
	public static String loadLanguageProperty(String sysKey) throws NoSuchFileException {

		Properties languageProperty = loadProperty(getLanguageConfig());

		return languageProperty.getProperty(sysKey);
	}
//	/**
//	 * 获取推送配置文件
//	 * @return
//	 */
//	public static Properties loadPropellingProperty() {
//		/**
//		 * 推送文件
//		 */
//		Properties	propellingProperty = loadProperty(MyConstant.CONFIGFILE_PROPELLING);
//
//		return propellingProperty;
//	}
//	/**
//	 * 获取集群配置文件
//	 * @return
//	 */
//	public static Properties loadClusterProperty() {
//		/**
//		 * 推送文件
//		 */
//		Properties	clusterProperty = loadProperty(MyConstant.CONFIGFILE_CLUSTER);
//
//		return clusterProperty;
//	}
//	/**
//	 * 判断配置文件是否存在
//	 * @throws IOException
//	 */
//	public static boolean exist4ConfigFile(String configfile) throws IOException {
//
//		//URL url = DataHelper.class.getClassLoader().getResource(MyConstant.configFile_propelling);
//		//(1)类的绝对路径：Class.class.getClass().getResource("/").getPath()
//		//结果：/D:/TEST/WebRoot/WEB-INF/classes/pack/
//		//(2)得到工程的路径：System.getProperty("user.dir")
//
//		String path = DataHelper.class.getResource("/").getPath();
//		//String path = Datahelper.class.getResource("/").getPath();
//		//System.out.println(path);
//		if(new File(path+configfile).exists()){
//			return true;
//		}
//		return false;
//
//	}
	/*public static void main(String[] args) throws IOException {
		//boolean a = new File("xxx/jiangx.sldfs").exists();
		System.out.println();
	}*/
//	/**
//	 * 获取证书配置文件(单例)
//	 * @return
//	 */
//	public static String loadLicenseProperty(String sysKey) throws NoSuchFileException {
//		if(licenseProperty!=null){
//			return licenseProperty.getProperty(sysKey);
//		}
//		//
//		licenseProperty = loadProperty(MyConstant.CONFIGFILE_LICENSE);
//
//		return licenseProperty.getProperty(sysKey);
//	}



	/**
	 * 获取报表配置文件(单例)
	 * @return
	 */
	public static String loadReportProperty(String sysKey) throws NoSuchFileException {
		if(reportProperty!=null){
			return reportProperty.getProperty(sysKey);
		}
		//
		reportProperty = loadProperty(getReportConfig());
		
		return reportProperty.getProperty(sysKey);
	}



	/**
	 * 获取配置文件（如果不存在，则返回一个空的property）
	 * @return
	 */
	private static Properties loadProperty(Path path) throws NoSuchFileException {
		Properties p = new Properties();
		if(path==null) {
			return p;//放回一个空的property
		}
		
		// 数据库连接类型
//		InputStream is = DataHelper.class.getClassLoader().getResourceAsStream(path);
		File configPath = path.toFile();
		if(!configPath.exists()){
			throw new NoSuchFileException("can not find default config file ["+configPath.getAbsolutePath()+"]");
		}


		try(InputStream is = new FileInputStream(configPath);
			InputStreamReader reader = new InputStreamReader(is, "UTF-8");
		) {

			p.load(reader);

		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return p;
	}
	/**
	 * 获取根据语言文件映射的对应文字
	 * @param key
	 * @return
	 */
	public static String getLanguageValueBy(String key){
		if(StringUtils.isBlank(key)) {
			return "";
		}
		
		if(currentlanguageValues !=null){
			return currentlanguageValues.getProperty(key);
		}
		//加载语言文件
        try {
			String languageStyle = loadLanguageProperty("language.style");
			if(StringUtils.isBlank(languageStyle)){
				languageStyle = "zh_CN";
			}

			String languageFileDir = loadLanguageProperty("language.directory");

			//默认目录
			Path fileDir = getDirOfConfig().resolve("language");

			//如果用户自定义，就使用用户的
			if(StringUtils.isNotBlank(languageFileDir)){
				fileDir = Paths.get(languageFileDir);
			}
			Path lanPath = fileDir.resolve(languageStyle+".properties");
			Properties p = loadProperty(lanPath);
			return p.getProperty(key);
        } catch (NoSuchFileException e) {
            e.printStackTrace();
			return key;
        }

	}

	/**
	 * 获取报表配置文件的值
	 * @param key
	 * @return
	 */
	public static String getReportValueBy(String key) throws IOException {
		String value = DataHelper.loadReportProperty(key);


		/*
		 * 说明是普通表名
		 */
		if (value.lastIndexOf(".sql") < 0) {

			/*
			 * 使用纯sql的拼写,需要加入（）后，方便以后拼写sql加入别名
			 */
			return " (" + value + ") ";
		}
		/*
		 * 说明是 sql 文件的引用
		 */
		// 读取sql文件的sql，拼凑成一行
		String reportDirectory = DataHelper.loadReportProperty("report.directory");

		//默认的报表SQL 读取目录
		Path sqlDir = DataHelper.getDirOfConfig().resolve("reporter");

		//如果用户自定义，就使用自定义
		if(StringUtils.isNotBlank(reportDirectory)){
			sqlDir = Paths.get(reportDirectory);
		}
		File configPath = sqlDir.resolve(value).toFile();

//		URL url = LoopLayer.class.getResource("/config/" + value);

//		File file = new File(url.getFile());

		String str = new String(Files.readAllBytes(configPath.toPath()));
		String temp = " (" +str.replace("\n", " ") + ") ";
		System.out.println("----------------SQL-Start------------");
		System.out.println("new View SQL:" + temp);
		System.out.println("----------------SQL-End------------");
		return temp;

	}


//	public static void main(String[] args) {
//		Path p = Paths.get("user").resolve("jiangxu");
//		System.out.println(p.toString());
//	}
	/**
	 * 根据语言获取配置文件的对应key的value值，如果不存在则使用原始值
	 * @param key
	 * @return
	 */
	public static String filterValueBy(String key){
		String s = getLanguageValueBy(key);
		if(StringUtils.isBlank(s)){
			return key;
		}
		return s;
		
	}

	/**
	 * 文件存在就删除
	 * @deprecated
	 * @param fileWithPath
	 */
	@Deprecated
	public static void deleteIfExists(String fileWithPath) {
		if (StringUtils.isBlank(fileWithPath)) {
			return;
		}
		Path p = new File(fileWithPath).toPath();
		try {
			Files.deleteIfExists(p);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	

	/**
	 * 获取客户端ip
	 * 
	 * @param request
	 * @return
	 */
//	public static String getClientIP(HttpServletRequest request) {
//		String ipAddress = request.getHeader("x-forwarded-for");
//		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
//			ipAddress = request.getHeader("Proxy-Client-IP");
//		}
//		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
//			ipAddress = request.getHeader("WL-Proxy-Client-IP");
//		}
//		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
//			ipAddress = request.getRemoteAddr();
//			if ("127.0.0.1".equals(ipAddress) || "0:0:0:0:0:0:0:1".equals(ipAddress)) {
//				// 根据网卡取本机配置的IP
//				InetAddress inet = null;
//				try {
//					inet = InetAddress.getLocalHost();
//				} catch (UnknownHostException e) {
//					e.printStackTrace();
//				}
//				ipAddress = inet.getHostAddress();
//			}
//		}
//		// 对于通过多个代理的情况，第一个IP为客户端真实IP,多个IP按照','分割
//		if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
//															// = 15
//			if (ipAddress.indexOf(",") > 0) {
//				ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
//			}
//		}
//		return ipAddress;
//	}
//
//	// 获取浏览器类型
//	public static String getBrowser(HttpServletRequest request) {
//		String value = request.getHeader("USER-AGENT");
//		if (value.indexOf("MSIE") > -1) {
//			value = value.substring(value.indexOf("MSIE"));
//			value = value.split(";")[0].substring(2);
//		} else if (value.indexOf("Firefox") > -1) {
//			value = value.substring(value.indexOf("Firefox"));
//		} else if (value.indexOf("Chrome/45.0.2454.93") > -1) {
//			value = value.substring(value.indexOf("Chrome"));
//		} else if (value.indexOf("Chrome/31.0.1650.63") > -1) {
//			value = "360";
//		}
//		return value;
//	}
//
//	/**
//	 * 获取操作系统
//	 * 
//	 * @param request
//	 * @return
//	 */
//	public static String getPlatform(HttpServletRequest request) {
//		// 操作系统信息
//		String osName = System.getProperty("os.name");
//		// 操作系统版本
//		String osVersion = System.getProperty("os.version");
//		String value = "";
//		value = osName + "-" + osVersion;
//		return value;
//	}

}
